﻿#define _CRT_SECURE_NO_WARNINGS

//#include<iostream>
//#include<vector>
//using namespace std;
//
//// 自定义类型
//struct Point
//
//{
//	int _x;
//	int _y;
//};
//
//// 自定义类型
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//		:_year(year)
//		, _month(month)
//		, _day(day)
//	{
//		cout << "Date(int year, int month, int day)" << endl;
//	}
//	Date(const Date& d)
//		:_year(d._year)
//		, _month(d._month)
//		, _day(d._day)
//	{
//		cout << "Date(const Date& d)" << endl;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//// ⼀切皆可⽤列表初始化，且可以不加= 
//int main()
//{
//    // C++98支持的 
//    int a1[] = { 1, 2, 3, 4, 5 };
//    int a2[5] = { 0 };
//    Point p = { 1, 2 };
//
//    // C++11支持的 
//    // 内置类型支持 
//    int x1 = { 2 };
//
//    // 自定义类型支持 
//    // 这里本质是用{ 2025, 1, 1 }构造一个Date临时对象 
//    // 临时对象再去拷贝构造d1，编译器优化后合二为一变成{ 2025, 1, 1 }直接构造初始化d1
//    Date d1 = { 2025, 1, 1 };
//
//    // 这里d2引用的是{ 2024, 7, 25 }构造的临时对象 
//    const Date& d2 = { 2024, 7, 25 };
//
//    // 需要注意的是C++98支持单参数时类型转换，也可以不用{} 
//    Date d3 = { 2025 };
//    Date d4 = 2025;
//
//    // 可以省略掉= 
//    Point p1{ 1, 2 };
//    int x2{ 2 };
//    Date d6{ 2024, 7, 25 };
//    const Date& d7{ 2024, 7, 25 };
//    // 不支持，只有{}初始化，才能省略= 
//    // Date d8 2025;
//
//    vector<Date> v;
//    v.push_back(d1);
//    v.push_back(Date(2025, 1, 1));
//
//    // 比起有名对象和匿名对象传参，这里{}更有性价比 
//    v.push_back({ 2025, 1, 1 });
//
//    return 0;
//}

//
//int main()
//{
//	std::initializer_list<int> mylist;
//	mylist = { 10, 20, 30 };
//	cout << sizeof(mylist) << endl;
//
//	// 这⾥begin和end返回的值initializer_list对象中存的两个指针 
//	// 这两个指针的值跟i的地址跟接近，说明数组存在栈上 
//	int i = 0;
//	cout << mylist.begin() << endl;
//	cout << mylist.end() << endl;
//	cout << &i << endl;
//}


//int main()
//{
//	// 左值引用不能直接引用右值，但是const左值引用可以引用右值 
//	const int& rx1 = 10;
//	const double& rx2 = x + y;
//	const double& rx3 = fmin(x, y);
//	const string& rx4 = string("11111");
//
//	// 右值引用不能直接引用左值，但是右值引用可以引用move(左值) (本质就是强转所以直接强转再引用也可以)
//	int&& rrx1 = move(b);
//	int*&& rrx2 = move(p);
//	int&& rrx3 = move(*p);
//	string&& rrx4 = move(s);
//	string&& rrx5 = (string&&)s;
//}

//int main()
//{
//	// b、r1、rr1都是变量表达式，都是左值 
//	cout << &b << endl;
//	cout << &r1 << endl;
//	cout << &rr1 << endl;
//}

//int main()
//{
//    std::string s1 = "Test";
//    // std::string&& r1 = s1;           // 错误：不能绑定到左值
//
//    const std::string& r2 = s1 + s1;    // OK：到 const 的左值引用延长生命周期
//    // r2 += "Test";                    // 错误：不能通过 const 的引用修改
//
//    std::string&& r3 = s1 + s1;         // OK：右值引用延长生命周期
//
//    r3 += "Test";                       // OK：能够通过非 const 的引用修改
//
//    std::cout << r3 << '\n';
//
//    return 0;
//}

class Solution 
{
public:
	// 传值返回需要拷贝
	string addStrings(string num1, string num2) 
	{
		string str;
		int end1 = num1.size() - 1, end2 = num2.size() - 1;
		// 进位 
		int next = 0;
		while (end1 >= 0 || end2 >= 0)
		{
			int val1 = end1 >= 0 ? num1[end1--] - '0' : 0;
			int val2 = end2 >= 0 ? num2[end2--] - '0' : 0;
			int ret = val1 + val2 + next;
			next = ret / 10;
			ret = ret % 10;
			str += ('0' + ret);
		}
		if (next == 1)
			str += '1';
		reverse(str.begin(), str.end());
		return str;
	}
};

class Solution 
{

public:
	// 这里的传值返回考拷贝代价就太⼤了 
	vector<vector<int>> generate(int numRows) 
	{
		vector<vector<int>> vv(numRows);
		for (int i = 0; i < numRows; ++i)
		{
			vv[i].resize(i + 1, 1);
		}
		for (int i = 2; i < numRows; ++i)
		{
			for (int j = 1; j < i; ++j)
			{
				vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
			}
		}
		return vv;
	}
};
